"""
@Author  : 康帅
@Time    : 2021/6/17 14:26
@Function: itertools变换输入
"""

from itertools import *


def times_two(x):
    return 2 * x


def multiply(x, y):
    return (x, y, x * y)


def itertools_map():
    """
    内置函数 map() 会将一个函数分别作用到输入的一个迭代器的每个元素数，
    并将其以迭代器的形式返回。这个迭代器会遍历完这个输入的迭代器
    :return:
    """
    print('Doubles:')
    for i in map(times_two, range(5)):
        print(i)

    print('\nMultiples:')
    r1 = range(5)
    r2 = range(5, 10)
    for i in map(multiply, r1, r2):
        print('{:d} * {:d} = {:d}'.format(*i))

    print('\nStopping:')
    r1 = range(5)
    r2 = range(2)
    for i in map(multiply, r1, r2):
        print(i)


def itertools_starmap():
    """
    starmap() 这个函数和 map() 的作用很相似。
    但是 map() 函数的输入实际上是由多个（或单个）迭代器组成的元组，
    而 starmap() 遍历的是一个返回元组的单个迭代器。
    它会用 * 记号把元组分离成参数列表传入函数。

    也就是说，对 map() 函数来说，它可以有多个参数 (i1, i2)，然后返回 f(i1, i2)。
    但对于 starmap() 来说，输入只有一个元组 i，它返回的是 f(*i)
    :return:
    """
    values = [(0, 5), (1, 6), (2, 7), (3, 8), (4, 9)]
    for i in starmap(lambda x, y: (x, y, x * y), values):
        print('{} * {} = {}'.format(*i))


if __name__ == '__main__':
    itertools_map()
    itertools_starmap()
